home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / ghost / gs403src_gs.lha / gs4.03 / gxfrac.h < prev    next >
C/C++ Source or Header  |  1996-01-20  |  3KB  |  92 lines

  1. /* Copyright (C) 1992, 1993 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* gxfrac.h */
  20. /* Fraction representation for Ghostscript */
  21.  
  22. #ifndef gxfrac_INCLUDED
  23. #  define gxfrac_INCLUDED
  24.  
  25. /*
  26.  * Represent a fraction in [0.0..1.0].
  27.  * Note that the 1.0 endpoint is included.
  28.  * Since undercolor removal requires a signed frac,
  29.  * we limit fracs to 15 bits rather than 16.
  30.  */
  31. typedef short frac;
  32. typedef short signed_frac;
  33. #define arch_log2_sizeof_frac arch_log2_sizeof_short
  34. #define arch_sizeof_frac arch_sizeof_short
  35. #define frac_bits 15
  36. #define frac_0 ((frac)0)
  37. /* The following definition of frac_1 allows exact representation of */
  38. /* almost all common fractions (e.g., N/360 for 0<=N<=360). */
  39. #define frac_1_0bits 3
  40. #define frac_1 ((frac)0x7ff8)
  41. #define frac_1_long ((long)frac_1)
  42. #define frac_1_float ((float)frac_1)
  43. /* Conversion between fracs and floats. */
  44. #define frac2float(fr) ((fr) / frac_1_float)
  45. #define float2frac(fl) ((frac)(((fl) + 0.5 / frac_1_float) * frac_1_float))
  46.  
  47. /*
  48.  * Conversion between unsigned fracs and bytes (or, in general,
  49.  * shorter integers) representing fractions. This is highly dependent
  50.  * on the definition of frac_1 above.
  51.  */
  52. #define _frac2s(fr)\
  53.   (((fr) >> (frac_bits - frac_1_0bits)) + (fr))
  54. #define frac2bits(fr, nb)\
  55.   ((uint)(_frac2s(fr) >> (frac_bits - (nb))))
  56. #define frac2byte(fr) ((byte)frac2bits(fr, 8))
  57. /* bits2frac requires frac_bits / 2 <= nb <= frac_bits. */
  58. #define bits2frac(v, nb) ((frac)(\
  59.   ((frac)(v) << (frac_bits - (nb))) +\
  60.    ((v) >> ((nb) * 2 - frac_bits)) -\
  61.    ((v) >> ((nb) - frac_1_0bits)) ))
  62. #define byte2frac(b) bits2frac(b, 8)
  63. /* Produce a result that is guaranteed to convert back to a frac */
  64. /* not exceeding the original value fr. */
  65. #define frac2bits_floor(fr, nb)\
  66.   ((uint)((_frac2s(fr) - (_frac2s(fr) >> (nb))) >> (frac_bits - (nb))))
  67. /*
  68.  * Conversion between fracs and unsigned shorts.
  69.  */
  70. #define ushort_bits (arch_sizeof_short * 8)
  71. #define frac2ushort(fr) ((ushort)(\
  72.   ((fr) << (ushort_bits - frac_bits)) +\
  73.   ((fr) >> (frac_bits * 2 - ushort_bits - frac_1_0bits)) ))
  74. #define ushort2frac(us) ((frac)(\
  75.   ((us) >> (ushort_bits - frac_bits)) -\
  76.   ((us) >> (ushort_bits - frac_1_0bits)) ))
  77. /*
  78.  * Compute the quotient Q = floor(P / frac_1),
  79.  * where P is the (ulong) product of a uint or ushort V and a frac F.
  80.  * See gxarith.h for the underlying algorithm.
  81.  */
  82. #define frac_1_quo(p)\
  83.   ( (((p) >> frac_1_0bits) + ((p) >> frac_bits) + 1) >> (frac_bits - frac_1_0bits) )
  84. /*
  85.  * Compute the remainder similarly, having already computed the quotient.
  86.  * This is, of course, P - Q * frac_1.
  87.  */
  88. #define frac_1_rem(p, q)\
  89.   ((frac)( (uint)(p) - ((q) << frac_bits) + ((q) << frac_1_0bits) ))
  90.  
  91. #endif                    /* gxfrac_INCLUDED */
  92.